package types

import (
	"fmt"
	"github.com/asdine/storm/v3"
	"os"
)

type StatusData struct {
	Vid    uint64 `storm:"id,unique"`
	Offset uint64
}

type Status struct {
	vid uint64
	db  *storm.DB
}

func NewStatus(vid uint64, db *storm.DB) *Status {
	s := new(Status)
	s.vid = vid
	s.db = db
	s.init()
	return s
}

func (s *Status) init() {
	num, err := s.db.Count(&StatusData{})
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
	if num == 0 {
		sd := StatusData{Vid: s.vid, Offset: 0}
		if err = s.db.Save(&sd); err != nil {
			fmt.Println(err)
			os.Exit(1)
		}
	}
}

func (s *Status) SetOffset(offset uint64) error {
	return s.db.UpdateField(&StatusData{Vid: s.vid}, "Offset", offset)
}

func (s *Status) GetOffset() (uint64, error) {
	var info StatusData
	err := s.db.One("Vid", s.vid, &info)
	if err != nil {
		if err == storm.ErrNotFound {
			return 0, nil
		}
		return 0, err
	}
	return info.Offset, nil
}

func (s *Status) Close() error {
	return s.db.Close()
}
